package od.one;

import java.util.Scanner;
/**
 * 机考代码查重
 * 华为OD机考完成之后，官方会进行代码查重。华为 od 机考确实有很大的概率抽到原题。如果碰到了题库中的原题，一定不要直接使用题解中的代码，尤其是变量名，一定要修改，可以改成毫无意义的单词。 除了变量名之外，代码的组织结构和逻辑一定要进行改变，这就要求在日常的刷题中，提前编写好属于自己的代码
 * ACM输入输出模式
 * 如果你经常使用Leetcode，会知道letcode是不需要编写输入输出函数的。但是华为OD机考使用的是 ACM 模式，需要手动编写输入和输出。
 * 所以最好在牛-客上提前熟悉这种模式。例如C++使用cin/cout, python使用input()/print()。JavaScript使用node的 readline()和console. log()。Java 使用sacnner/system. out. print()
 *
 * @author: Shelly
 * @create: 2024-01-29 13:30:23
 * @version: 1.0
 * @describe: 字符串序列判定/最后一个有效字符
 * 输入两个字符串S和L，都只包含英文小写字母。 S长度<=100，L长度<= 500,000。判定S是否是L的有效子串。
 * 判定规则：
 * S中的每个字符在L中都能找到(可以不连续) ，
 * 且S在L中字符的前后顺序与S中顺序要保持一致。
 * (例如,S="ace"是L="abcde"的一个子序列且有效字符是a、 c、 e，而"aec"不是有效子序列，且有效字符只有a、e)
 *
 * 输入描述:
 * 输入两个字符串S和L，都只包含英文小写字母。 S长度<=100，L长度<= 500,000
 * 先输入S，再输入L，每个字符串占一行。
 *
 * 输出描述:
 * 输出S串最后一个有效字符在L中的位置。(首位从0开始计算，无有效字符返回-1)
 *
 * 用例1
 * 输入
 * ace
 * abcde
 * 输出
 * 4
 *
 * 用例2
 * 输入
 * fgh
 * abcde
 * 输出
 * -1
 */
public class OD01 {
    public static void main(String[] args) {
        // 创建一个Scanner对象来读取用户的输入
        Scanner scanner = new Scanner(System. in);
        // 读取第一个字符串S
        String stringS = scanner. nextLine();
         // 读取第二个字符串L
         String stringL = scanner. nextLine();

         // 初始化两个索引，分别用于遍历S和L
         int indexS = 0;
         int indexL = 0;

         // 当S和L都没有遍历完时，继续遍历
         while (indexS < stringS.length() && indexL < stringL.length()) {
            // 如果S中的当前字符与L中的当前字符相同，则S的索引加1
            if (stringS.charAt(indexS) == stringL.charAt(indexL)) {
               indexS++;
            }
            // 无论字符是否相同，L的索引都加1
            indexL++;
        }
        // 如果S的所有字符都在L中找到了(即S已经遍历完了) ，则打印L中最后一个有效字符的位置(即L的当前索引减1)
        if (indexS == stringS.length()) System.out.println(indexL - 1);
        // 如果S还有字符没有在L中找到，则打印-1
        else System. out. println(-1);
    }
}



/*
解题思路
我们初始化两个指针i和j，分别用于遍历S和L。
接下来，我们使用双指针法进行遍历，当i小于S的长度且j小于L的长度时，进行循环。
在循环中，我们判断S中的当前字符是否与L中的当前字符相等，如果相等，则将i指针向后移动一位。
无论字符是否相等，我们都将j指针向后移动一位。
当循环结束后，我们判断i是否等于S的长度，如果等于，则说明S的所有字符都在L中找到了，打印L中最后一个有效字符的位置(即j的值减1) ； 否则，说明S还有字符没有在L中找到，打印-1。
最后，我们得到了S串最后一个有效字符在L中的位置。
 * */